home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 2.toast / pc / sample code / interapplication comm / menuscripter / sources / msaeclone.c < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.7 KB  |  113 lines

  1. // MSAEClone.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. /*
  8.     14-Nov-95 : GS : Disposed of all interim descriptors in DoClone().
  9. */
  10.  
  11. #include "MSAEClone.h"
  12.  
  13. #include "MSAEUtils.h"
  14. #include "MSAECreate.h"
  15. #include "MSAEGetData.h"
  16.  
  17.  
  18. #pragma segment AppleEvent
  19.  
  20.  
  21. // Clone an object - only handles text objects
  22.      
  23.      
  24. pascal OSErr    DoClone(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  25. {
  26. #ifdef __MWERKS__
  27.     #pragma unused (reply, refcon)
  28. #endif
  29.  
  30.     AEDesc        directObj = {typeNull, NULL},
  31.                 insertHereDesc = {typeNull, NULL},
  32.                 resultDesc = {typeNull, NULL};
  33.     OSErr        err;
  34.  
  35.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  36.     if (noErr != err) goto done;
  37.  
  38.     err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
  39.     if (noErr != err) goto done;
  40.  
  41.     err = GotRequiredParams(theAppleEvent);
  42.     if (noErr != err) goto done;
  43.     
  44.     err = CloneDesc(&directObj, &insertHereDesc, &resultDesc);
  45.     if (noErr != err) goto done;
  46.     
  47.     err = AddResultToReply(&resultDesc, reply, err);
  48.  
  49. done:
  50.     (void)AEDisposeDesc(&directObj);
  51.     (void)AEDisposeDesc(&insertHereDesc);
  52.     (void)AEDisposeDesc(&resultDesc);
  53.         
  54.     return(err);
  55. }
  56.  
  57. OSErr    CloneTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
  58. {
  59.     TextToken        aTextToken;
  60.     Size            actualSize;
  61.     AEDesc            dataDesc = {typeNull, NULL},
  62.                     propertyDesc = {typeNull, NULL};    // Use to pass no properties
  63.     OSErr            err;
  64.  
  65.     if (typeMyText != textDesc->descriptorType)
  66.         return(errAETypeError);
  67.         
  68.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  69.     
  70.     err = GetTextTextProperty(&aTextToken, &dataDesc);
  71.     if (noErr != err) goto done;
  72.     
  73.     err = CreateText(cText, &dataDesc, insertHereDesc, &propertyDesc, result);
  74.  
  75. done:
  76.     if (dataDesc.dataHandle)
  77.         AEDisposeDesc(&dataDesc);
  78.  
  79.     return(err);
  80. }
  81.  
  82. OSErr    CloneDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
  83. {
  84.     AEDesc        cloneDesc = {typeNull, NULL},
  85.                 textDesc = {typeNull, NULL};
  86.     OSErr        err;
  87.     
  88.     if (typeObjectSpecifier == aDesc->descriptorType)
  89.         err = AEResolve(aDesc, kAEIDoMinimum, &cloneDesc);
  90.     else if (typeNull != aDesc->descriptorType)
  91.         err = AEDuplicateDesc(aDesc, &cloneDesc);
  92.         
  93.     if (noErr != err) goto done;
  94.     
  95.     switch (cloneDesc.descriptorType)
  96.     {
  97.         case typeAEList:
  98.             err = errAETypeError;
  99.             // We can't handle copying more than one item to the scrap
  100.             break;
  101.             
  102.         default:
  103.             err = AECoerceDesc(&cloneDesc, typeMyText, &textDesc);
  104.             if (noErr != err) goto done;
  105.             err = CloneTextDesc(&textDesc, insertHereDesc, result);
  106.     }
  107.     
  108. done:
  109.     (void)AEDisposeDesc(&cloneDesc);
  110.     (void)AEDisposeDesc(&textDesc);
  111.     
  112.     return(err);
  113. }